package main

import "fmt"

type Animal struct {
	name string
	age  int
}

// 用该函数构建一个全新的实例,构造函数，构造器，普通函数，不是该类型方法
// 构造函数，返回该类型的指针
func New() *Animal {
	// t := Animal{}
	// fmt.Printf("%T %[1]v, %p\n", t, &t)
	// return &t

	t := new(Animal)
	fmt.Printf("%T %[1]v, %p\n", t, t)
	return t
}

// go不支持重载，overload
func NewAnimal(name string, age int) *Animal {
	// return &Animal{name, age}
	return &Animal{name: name, age: age}
}

func main() {
	// var a1 Animal
	// var a2 = Animal{age: 33}
	var a3 = NewAnimal("tom", 30)
	fmt.Printf("%T %[1]v, %p\n", a3, a3)

}
